#include <iostream>
#include <vector>
#include <cstdlib>
#include <signal.h>
#include <math.h>
#include <set>

using namespace std;

typedef struct _jugada {
	int puntaje_propio;
	int i;
	int j;
	int d;
	vector<_jugada> *siguientes;
	
} jugada;

void mostrarJugada(ostream &out, jugada u){
	out << "[i: " << u.i << " j: " << u.j << " d: " << u.d <<" - puntaje:" << u.puntaje_propio << "]"<<endl;
}

typedef vector<int> vint;
typedef vector<vint> vvint;
typedef vector< vector<pair<int,int> > > vvpun;

#define forn(i,n) for(int i=0; i < (int)(n); ++i)
#define MAS_INFINITO 999999
#define MENOS_INFINITO -999999

vvint tbl;
vvpun tbl_puntajes;
vvint tbl_islas;

int n;
int yo;
int isla_actual = 2;

/* Función para mostrar el tablero en stderr */
void board_show() {
	forn(i,n) { forn(j,n) cerr << ".#X"[tbl[i][j]+1]; cerr << endl; }
}

int dameIslaPropia(int i, int j, int d, int k){
	if(i>0){
		if(tbl[i-1][j] == k){
			return tbl_islas[i-1][j];
		}
		if( d == 0 && tbl[i-1][j+1] == k){
			return tbl_islas[i-1][j+1];
		}
	}
	if(j>0){
		if(tbl[i][j-1] == k){
			return tbl_islas[i][j-1];
		}
		if(d == 1 && tbl[i+1][j-1] == k){
			return tbl_islas[i+1][j-1];
		}
	}
	if(d == 0){
		if(j<n-2 && tbl[i][j+2] == k ){
			return tbl_islas[i][j+2];
		}
		if(i<n-1 && tbl[i+1][j] == k ){
			return tbl_islas[i+1][j];
		}
	}
	if(d == 1){
		if(i<n-2 && tbl[i+2][j] == k ){
			return tbl_islas[i+2][j];
		}
		if(j<n-1 && tbl[i][j+1] == k ){
			return tbl_islas[i][j+1];
		}
	}
	if(i<n-1 && j<n-1){
		if(tbl[i+1][j+1] == k ){
			return tbl_islas[i+1][j+1] ;
		}
	}
	return -1;
}

void pintar(int i, int j, int c , int color){
	if( (i>-1)
		&& (j>-1)
		&& (i<n)
		&& (j<n)
		&& (tbl[i][j] == c)
		&& (tbl_islas[i][j] != color)){

		tbl_islas[i][j] = color;
		pintar(i+1,j,c,color);
		pintar(i,j+1,c,color);
		pintar(i-1,j,c,color);
		pintar(i,j-1,c,color);
	}


}

int nuevaIsla(){
	isla_actual = isla_actual + 2;
	return isla_actual;
}

void aplica_movida(int i, int j, int d, int k) {
	int isla = -1;
	tbl[i][j] = k;
	tbl[i+d][j+1-d] = k;

	isla = dameIslaPropia(i, j, d, k);
	if (isla != -1){
		pintar(i,j,k,isla);
	}else{
		pintar(i,j,k,nuevaIsla()+k);
	}
}

void lee_movida(int k) {
	int i,j,d;
	cin >> i >> j >> d; i--; j--;
	/* No es necesario checkear que la jugada sea válida, estamos seguros */
	aplica_movida(i,j,d,k);
}

int hay_movida() {
	
	forn(i,n) forn(j,n-1) if (tbl[i][j] == -1 && tbl[i][j+1] == -1) return true;
	forn(i,n-1) forn(j,n) if (tbl[i][j] == -1 && tbl[i+1][j] == -1) return true;
	return false;
}

/* Cuando se reciba un SIGTERM se ejecutará esta función. No es necesario
 * hacer nada acá, pero si alguno lo necesita puede hacer alguna tarea acá,
 * como guardar estadísticas del juego, etc. */
void terminar(int) {
	cerr << "Uy!, se acabó el partido!" << endl;
	exit(0);
}

void limpiar_tablero (){
	forn (i,n) forn (j,n) {
		tbl_puntajes[i][j] = make_pair (0,0);
	}
}

set <int> armo_conjunto_con_islas (int i, int j,int d){
	set <int> res;

	if (i>0){
		if (d ==0){
			// son las 2 celdas que estan arriba
			res.insert (tbl_islas[i-1][j]);
			res.insert (tbl_islas[i-1][j+1]);
		}else{
			// es la celda que esta arriba
			res.insert (tbl_islas[i-1][j]);
		}
	}
	if(i<n-1){
		if (d ==0){
			// son las 2 celdas que estan abajo
			res.insert (tbl_islas[i+1][j]);
			res.insert (tbl_islas[i+1][j+1]);
		}else{
			// es la celda que esta abajo
			if(i<n-2)res.insert (tbl_islas[i+2][j]);
		}
	}
	if (j>0) {
		if (d ==0){
			// es la celda que esta a la izquierda
			res.insert (tbl_islas[i][j-1]);
		}else{
			// son las 2 celdas que estan a la izquierda
			res.insert (tbl_islas[i][j-1]);
			res.insert (tbl_islas[i+1][j-1]);
		}
	}
	if (j<n-1) {
		if (d ==0){
			if (j<n-2)res.insert (tbl_islas[i][j+2]);
		}else{
		// son las 2 celdas que estan a la derecha
			res.insert (tbl_islas[i][j+1]);
			res.insert (tbl_islas[i+1][j+1]);
		}
	}
	

return res;
}

int calculo_puntaje (set <int> vecinos){
	int res = 0;
	int resmio = 0;
	int resotro = 0;
	set<int>::iterator it;

	for( it = vecinos.begin(); it != vecinos.end(); it++ ) {
		int auxiliar = *it;
		if (auxiliar != -1){
			
			//mostrameIslas();
			if ((auxiliar % 2) == yo) resmio++;
			else resotro++;
		}
	}

	res = max(resmio,resotro) + 1;
	return res;
}

float distanciaAlCentro(int i, int j){
	float di = abs(i - (n/2));
	float dj = abs(j - (n/2));

	return (pow( pow(di,2) + pow(dj,2), 0.5));
}

jugada armar_jugadas(vvint &jugadas, int k) {
	jugada res;
	int puntaje = -1;
	float dist = n*n;
	res.puntaje_propio = 0;
	res.i = -1;
	res.j = -1;
	res.d = -1;

	limpiar_tablero();

	set <int> vecinos;

	forn (i,n) forn(j,n){
		if ((j<n-1) && jugadas[i][j] == -1 && jugadas[i][j+1] == -1) {
			vecinos = armo_conjunto_con_islas(i,j,0);
			//el set de vecinos me deberia definir el puntaje...
			puntaje = calculo_puntaje(vecinos);
			tbl_puntajes[i][j].first = puntaje;
			if (res.puntaje_propio < puntaje){
				res.puntaje_propio = puntaje;
				res.i = i;
				res.j = j;
				res.d = 0;
				dist = distanciaAlCentro(i,j);
			}
		}

		if ((i<n-1) && jugadas[i][j] == -1 && jugadas[i+1][j] == -1) {
			vecinos = armo_conjunto_con_islas(i,j,1);
			//el set de vecinos me deberia definir el puntaje...
			puntaje = calculo_puntaje(vecinos);
			//cerr << "puntaje: " << puntaje << endl;
			tbl_puntajes[i][j].second = puntaje;
			if (res.puntaje_propio < puntaje){
				res.puntaje_propio = puntaje;
				res.i = i;
				res.j = j;
				res.d = 1;
				dist = distanciaAlCentro(i,j);
			}
		}
	}
		
	return res;
}

void juega_movida(int k) {
	int a =  MENOS_INFINITO;
	int b =  MAS_INFINITO;

	jugada res = armar_jugadas(tbl,k);
	
	aplica_movida(res.i,res.j,res.d,k);
	
	cout << res.i+1 << " " << res.j+1 << " " << res.d << endl;
}


int main(int argc, char* argv[]) {
	signal(SIGTERM, terminar);
	int c;
	cin >> n >> c;
	tbl = vvint(n, vint(n, -1));
	tbl_islas = vvint(n, vint(n, -1));
	tbl_puntajes = vector< vector <pair <int, int> > >(n,vector <pair <int, int> >(n,make_pair(0,0)));

	yo = c;

	/* Si c==1, arrancamos leyendo una jugada del otro */
	if (n>1 && c) lee_movida(!c);

	while (hay_movida()) {
		juega_movida(c);
		
		// Si no hay movida para hacer se cuelga leyendo, pero el judge nos mata el proceso con SIGTERM
		lee_movida(!c); 
	}
	return 0;
}
